<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Promise的API</title>
  </head>
  <body>
    <!-- 
        1、Promise构造函数： new Promise(executor){}
            executor函数：是同步执行的，（resolve,reject）=>{}
            resolve函数：调用resolve将Promise实例内部状态改为成功{fulfilled}
            reject函数：调用reject将Promise实例内部状态改为失败(rejected)
            
            说明： executor函数会在Promise内部立即执行同步调用，异步代码放在executor函数中。

        2、Promise.prototype.then()方法:Promise实例.then(onFulfilled,onRejected)
            onFulfilled: 成功的回调函数 （value）=>{}
            onRejected：失败的回调函数 (reason) => {}

            特别注意难点（）：then()方法会返回一个新的Promise实例对象
        3、Promise.prototype.catch()方法：Promise实例.catch(onRejected)
            onRejected:失败的回调函数(reason) =>{}
            说明： catch方法是then方法的语法糖，相当于 then(undefined,onRejected)
        
        4、Promise.resolve方法：Promise.resolve(value)
            说明：用于快速返回一个状态为fulfilled或rejected的Promise实例对象

            备注： value的值可能是：（1）非Promise值 （2）Promise值
        
        5、Promise.reject方法: Promise.reject(reason)
             说明：用于快速返回一个状态为rejected的Promise实例对象
        
        6、Promise.all()方法：Promise.all(promiseArr)
            promiseArr：包含n个Promise实例的数组
             说明：返回一个新的Promise实例，只有所有的promise都成功，只要有一个失败了就直接返回失败

        7、Promise.race()方法： Promise.race(promiseArr)
            promiseArr：包含n个Promise实例的数组
             说明：返回一个新的Promise实例，成功还是失败？以最先出结果的promise为准
     -->
    <script>
      // 验证： 特别注意难点（）：then()方法会返回一个新的Promise实例对象
      //#region
      //   const x = new Promise((resolve, reject) => {
      //     setTimeout(() => {
      //       resolve(200)
      //     }, 1000)
      //   })
      //   x.then(
      //     (value) => {
      //       console.log('成功了')
      //     },
      //     (reason) => {
      //       console.log('失败了')
      //     }
      //   )
      //   console.log(x)
      //endregion

      //#region
      // Promise.prototype.catch()方法
      //   const x = new Promise((resolve, reject) => {
      //     setTimeout(() => {
      //       //   resolve(200)
      //       reject(-20)
      //     }, 1000)
      //   })
      //   //   x.then(undefined, (reason) => {
      //   //     console.log('失败了', reason)
      //   //   })
      //   //   x.then(undefined, (reason) => {
      //   //     console.log('失败了1', reason)
      //   //   })
      //   x.then((value) => {
      //     console.log('成功了', value)
      //   })
      //   x.catch((reason) => {
      //     console.log('失败了2', reason)
      //   })
      //   console.log(x)
      //endregion

      //#region
      // Promise.resolve  Promise.reject
      //   const p0 = {}
      //   const p0 = []
      //   const p0 = 'eeeeee'
      //   const p0 = () => {}
      //   const p0 = null
      //   const p0 = Promise.resolve(200)
      //   const p0 = Promise.reject(-300) //传一个状态为失败的promise实例，
      //   const p = Promise.resolve(p0) //失败啦
      //   p.then(
      //     (value) => {
      //       console.log('成功啦', value)
      //     },
      //     (reason) => {
      //       console.log('失败啦', reason)
      //     }
      //   )

      //   const p0 = Promise.resolve(300) //传一个状态为失败的promise实例，
      //   const p = Promise.reject(p0) //返回为成功
      //   p.then(
      //     (value) => {
      //       console.log('成功啦', value) //成功
      //     },
      //     (reason) => {
      //       console.log('失败啦', reason)
      //     }
      //   )
      //#endregion

      //#region
      // Promise.all()方法

      //   const p1 = Promise.resolve(200)
      //   const p2 = new Promise((resolve, reject) => {
      //     setTimeout(() => {
      //       resolve(300)
      //       //   reject(-300)
      //     }, 500)
      //   })
      //   const p3 = new Promise((resolve, reject) => {
      //     setTimeout(() => {
      //       //   resolve(400)
      //       reject(-400)
      //     }, 2000)
      //   })

      //   Promise.all([p1, p2, p3]).then(
      //     (value) => {
      //       console.log('成功了', value)
      //     },
      //     (reason) => {
      //       console.log('失败了', reason)
      //     }
      //   )
      //#endregion

      // Promise.race()方法
      //   const p1 = Promise.resolve(200)
      const p1 = new Promise((resolve, reject) => {
        reject(-200)
      })
      const p2 = new Promise((resolve, reject) => {
        // setTimeout(() => {
        //   resolve(300)
        //   //   reject(-300)
        // }, 500)
        reject(-500)
      })
      const p3 = new Promise((resolve, reject) => {
        // setTimeout(() => {
        //   //   resolve(400)
        //   reject(-400)
        // }, 200)
        reject(-300)
      })

      Promise.race([p1, p2, p3]).then(
        //只要最快的那个人
        (value) => {
          console.log('成功了', value)
        },
        (reason) => {
          console.log('失败了', reason)
        }
      )
    </script>
  </body>
</html>
